﻿using System.Windows;
using System.Windows.Controls;
using AllInOne.Dados;
using AllInOne.Negocio;
using System;
using System.Collections.Generic;
using AllInOne.Util;

namespace AllInOne
{
    /// <summary>
    /// Interaction logic for TelaServicosAdicionar.xaml
    /// </summary>
    public partial class TelaServicosAdicionar : UserControl
    {
        #region Atributos

        private NegocioServico negocioServ;

        #endregion;

        #region Inicialização da tela

        public TelaServicosAdicionar()
        {
            inicializar(null);
        }

        public TelaServicosAdicionar(Servico atual)
        {
            inicializar(atual);
        }


        /// <summary>
        /// Inicializa a tela e adiciona o parâmetro indicado para 'bind' na tela
        /// </summary>
        /// <param name="atual"></param>
        private void inicializar(Servico atual)
        {
            InitializeComponent();
            this.negocioServ = new NegocioServico();

            if (atual != null)
            {
                this.lblTitulo.Content = "Serviços - Editar";
                this.Resources["atual"] = atual;
            }
            else
            {
                this.lblTitulo.Content = "Serviços - Adicionar";
            }
        }

        #endregion;

        #region Métodos

        /// <summary>
        /// Salva ou atualiza o item atual
        /// </summary>
        /// <param name="atual"></param>
        private void Salvar(Servico atual)
        {
            //Se já possui Id, o objeto já está no banco
            if (atual.Id > 0)
            {
                bool retorno = negocioServ.atualizar(atual);

                if (retorno)
                    MensagemUtil.MostrarMensagem("Serviço atualizado com sucesso", "Confirmação");

                else
                    MensagemUtil.MostrarMensagem("Não foi possível atualizar o serviço", "Aviso");
            }

            //Caso contrário, insere
            else
            {
                int result = negocioServ.adicionar(atual);

                if (result > 0)
                {
                    //Retorna o Id de inserção
                    atual.Id = result;

                    //Coloca o objeto atualizado na tela
                    MensagemUtil.MostrarMensagem("Salvo com sucesso", "Confirmação");
                    this.inicializar(atual);
                }
                else
                {
                    MensagemUtil.MostrarMensagem("Não foi possível salvar o serviço atual.", "Aviso");
                }
            }
        }


        /// <summary>
        /// Validação dos campos obrigatórios
        /// </summary>
        /// <param name="servico">Serviço a validar os campos</param>
        /// <returns><code>true</code> - Validação ok, <code>false</code>- Validação não passou</returns>
        private bool ValidarCampos(Servico servico)
        {
            bool retorno = true;
            List<string> invalidos = new List<string>();

            if (string.IsNullOrEmpty(servico.Nome))
                invalidos.Add("Nome");
            if (servico.Valor <= 0)
                invalidos.Add("Valor");
            
            if (invalidos.Count > 0)
            {
                retorno = false;
                MensagemUtil.MostrarMensagemErros(invalidos);
            }

            return retorno;
        }

        #endregion;

        #region Eventos dos botões da tela

        /// <summary>
        /// Clique do botão salvar
        /// </summary>
        private void btnSalvar_Click(object sender, RoutedEventArgs e)
        {
            Servico atual = this.Resources["atual"] as Servico;

            if (ValidarCampos(atual))
            {
                Salvar(atual);
            }
        }

        /// <summary>
        /// Reseta o objeto utilizado para 'bind' na tela
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLimpar_Click(object sender, RoutedEventArgs e)
        {
            this.Resources["atual"] = new Servico();
            this.inicializar(null);
        }

        #endregion
    }
}
